package Online;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.61
 */
public class Inicio {
    
    /*
     * Variables para la conexión a la BD
     */
        private String bd = "is2"; 
        private String user = "root";
        private String url ="jdbc:mysql://localhost/" + bd;
        private Connection conexion;
        private java.sql.Statement statement;
    
    
    /*
     * En el constructor se conecta a la base de datos
     */
    public Inicio(){
            try {
                //Se añade la biblioteca de mysql
                Class.forName("com.mysql.jdbc.Driver");
                //Se conecta a la BD
                conexion = DriverManager.getConnection(url, user,"");
                //Se genera la variable que interacciona con la BD
                statement = conexion.createStatement();
            } catch (SQLException ex) {
                //Logger.getLogger(VentanaInicio.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                //Logger.getLogger(VentanaInicio.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    
   /**
    * Metodo que indica el estado de la conexion
    * @return boolean
    */
    public boolean estado(){
        return (!(statement == null));
    }
    
    
    /**
     * Metodo que dados un user y un pass realiza la conexión.
     * @param name
     * @param pass
     * @return boolean
     */
    public boolean Login(String name, String pass){
            boolean logueado = false;
            try { 
               //Consulta SQL, buscando un usuario que coincida user y pass
                String consulta = "SELECT U.Nombre FROM usuario U WHERE ((U.Usuario = \""+name+"\")AND"
                        + "(U.Contraseña = \""+pass+"\"));";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                if (result.next()){
                    logueado = true;
                }
            
            } catch (SQLException ex) {
                //Si no se consigue la conexion se indica
                logueado = false;
            }                
            return logueado;
        } 
        
        /**
         * Metodo que indica si existe o no un usuario
         * @param usuario
         * @return boolean
         */
        public boolean Existe(String usuario){
            try {
                //Consulta para ver si el nombre de usuario ya esta cogido
                ResultSet rs = statement.executeQuery("SELECT Usuario FROM usuario WHERE Usuario = \""+usuario+"\";");
                //Se comprueba que no exista el usuario
                return rs.next();
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return false;
            }
        }   
        
        /**
         * Metodo que devuelve el mail asociado a un usuario
         * @param usuario
         * @return String
         */
        public String getMail(String usuario){
            try {
                //Consulta para ver si el nombre de usuario ya esta cogido
                String consulta = "SELECT email FROM usuario WHERE Usuario = \""+usuario+"\";";
                ResultSet rs = statement.executeQuery(consulta);
                rs.next();
                //Se comprueba que no exista el usuario
                return rs.getString(1);
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return null;
            }
        } 
        
        /**
         * Metodo que devuelve la pass de un usuario
         * @param usuario
         * @return String
         */
        public String getPass(String usuario){
            try {
                //Consulta para ver si el nombre de usuario ya esta cogido
                String consulta = "SELECT Contraseña FROM usuario WHERE Usuario = \""+usuario+"\";";
                ResultSet rs = statement.executeQuery(consulta);
                rs.next();
                //Se comprueba que no exista el usuario
                return rs.getString(1);
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return null;
            }
        }        
    
        /**
         * Metodo para modificar la pass de un usuario
         * @param usuario
         * @param pass
         * @return boolean
         */
        public boolean setPass(String usuario,String pass){
            try {
                String consulta = "UPDATE usuario SET Contraseña = \""+pass+"\" WHERE Usuario = \""+usuario+"\";";
                //Consulta para ver si el nombre de usuario ya esta cogido
                int rs = statement.executeUpdate(consulta);
                //Se comprueba que no exista el usuario
                return true;
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return false;
            }
        }
    
        /**
         * Metodo que devuelve los datos de un usuario
         * @param usuario
         * @return String[]
         */
        public String [] getDatos(String usuario){
            String [] datos= new String[5];
            try {
                //Consulta para ver si el nombre de usuario ya esta cogido
                String consulta = "SELECT * FROM usuario WHERE Usuario = \""+usuario+"\";";
                ResultSet rs = statement.executeQuery(consulta);
                rs.next();
                datos[0]=rs.getString(3);
                datos[1]=rs.getString(4);
                datos[2]=rs.getString(5);
                datos[3]=rs.getString(6);
                datos[4]=rs.getString(7);
                return datos;
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return null;
            }
        }        
    
        /**
         * Metodo para modificar los datos de un usuario
         * @param usuario
         * @param nombre
         * @param apellidos
         * @param email
         * @param pais
         * @param ciudad
         * @return boolean
         */
        public boolean setDatos(String usuario,String nombre,String apellidos,String email,
                                String pais,String ciudad){
            try {
                String consulta = "UPDATE usuario SET Nombre = \""+nombre+"\", "
                                    +"Apellidos = \""+apellidos+"\", "
                                    +"email = \""+email+"\", "
                                    +"Pais = \""+pais+"\", "
                                    +"Ciudad = \""+ciudad+"\""
                                    + " WHERE Usuario = \""+usuario+"\";";
                //Consulta para ver si el nombre de usuario ya esta cogido
                int rs = statement.executeUpdate(consulta);
                //Se comprueba que no exista el usuario
                return true;
                
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                return false;
            }
        }
        
        
        
        /**
         * Metodo que dados un user y un pass realiza crea un nuev usuario.
         * @param name
         * @param pass
         * @return bolean
         */
        public boolean NewUser(String usuario,String pass,String nombre,String apellidos,String email,
                               String pais,String ciudad,String pregunta,String respuesta){
            boolean logueado = false;
            try {
                //Consulta para ver si el nombre de usuario ya esta cogido
                ResultSet rs = statement.executeQuery("SELECT Usuario FROM usuario WHERE Usuario = \""+usuario+"\";");
                //Se comprueba que no exista el usuario
                if (!rs.next()){
                    Date fecha = new Date();
                    String comando = "INSERT INTO usuario VALUES ('"+usuario+"','"+pass+"','"+nombre+
                            "','"+apellidos+"','"+email+"','"+pais+"','"+ciudad+"','"+pregunta+"','"+respuesta+"')";
                    //Se crea el usuario
                    statement.executeUpdate(comando);
                    //Se crea su Lista Principal
                    comando = "INSERT INTO lista VALUES  ('"+usuario+"Lista Principal','Lista Principal','"
                        +usuario+"',\""+(fecha.getYear()+1900)+"/"+(fecha.getMonth()+1)+"/"+fecha.getDate()+" "+
                        fecha.getHours()+":"+fecha.getMinutes()+":"+fecha.getSeconds()+"\");";
                    statement.executeUpdate(comando);
                    //Se crea su Lista Principal
                    comando = "INSERT INTO opciones VALUES  (10,3,\"Lista Principal\",\""+usuario+"\");";
                    System.out.println(comando);
                    statement.executeUpdate(comando);
                    //Consulta SQL, insertado una nueva tarea
                    comando = "INSERT INTO mapa(Nombre, Usuario)"+
                         "VALUES (\"Principal\",\""+usuario+"\");";
                    System.out.println(comando);
                    //Resultado de la consulta
                    statement.executeUpdate(comando);
                    String consulta = "SELECT L1.identificador FROM `mapa` L1 Where L1.Usuario = \""+usuario+"\""
                        + "AND L1.Nombre =\"Principal\";";
                    System.out.println(consulta);
                    //Resultado de la consulta
                    ResultSet result = statement.executeQuery(consulta);
                    result.getRow();
                    result.next();
                    //Consulta SQL, insertado una nueva tarea
                    comando = "INSERT INTO `listas de mapa`(idMapa,Nombre,x,y)"+
                         "VALUES ("+result.getString(1)+",\""+usuario+"Lista Principal\",0,0);";
                    System.out.println(comando);
                    //Resultado de la consulta
                    statement.executeUpdate(comando);
                    logueado = true;
                }
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                logueado = false;
            }
           return logueado;
        }
        
        
        /**
         * Metodo que devuelve la pass dada la pregunta y respuesta secreta
         * @param name
         * @param pregunta
         * @param respuesta
         * @return String
         */
        public String recuperarPass(String name, String pregunta,String respuesta){
            String pass = "";
            try { 
               //Consulta SQL, buscando un usuario que coincida user y pass
                String consulta = "SELECT U.Contraseña FROM usuario U WHERE ((U.Usuario = \""+name+"\")AND"
                        + "(U.Pregunta = \""+pregunta+"\")AND(U.Respuesta = \""+respuesta+"\"));";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                if (result.next()){
                    pass = result.getString(1);
                }
            
            } catch (SQLException ex) {
                //Si no se consigue la conexion se indica
                pass = null;
            }                
            return pass;
        } 
}
